home *** CD-ROM | disk | FTP | other *** search
- /*==============================================================================
-
- FICHERO: MAC.C
-
- AUTOR: ANTONIO LADESA JURADO
-
- FECHA: 24/6/94
-
- DESCRIPCION:
-
- Fichero que contiene las estructuras, constantes, variables y funciones
- internas y externas para el procesamiento de ficheros MAC.
-
- ==============================================================================*/
-
-
- /*---- MODULOS USADOS --------------------------------------------------------*/
-
- #include <stdio.h>
- #include <alloc.h>
- #include <string.h>
-
- #include "global.h"
- #include "memoria.h"
- #include "mac.h"
- #include "error.h"
-
-
- /*----ESTRUCTURAS, CONSTANTES Y VARIABLES LOCALES AL MODULO ------------------*/
-
-
- /* cabecera estandar de un fichero MAC */
- typedef struct
- {
- char byte_cero;
- char longitud;
- char nombre[63];
- char tipo[4];
- char creador[4];
- char relleno1[10];
- long tam_datos;
- long tam_codigo;
- long creacion;
- long modificacion;
- char relleno2[33];
- char patrones[304];
- char relleno3[204];
- }CABmac;
-
- /* cabecera del fichero MAC */
- static CABmac cabecera;
-
-
- /*---- DEFINICION DE LAS FUNCIONES INTERNAS ----------------------------------*/
-
-
- int MACleerImagen(IMAGEN *c,FILE *f);
- IMAGEN *MACleerCabecera(IMAGEN *c,FILE *f,char *nombre);
- int MACleerLinea(char *p,FILE *f);
-
- void MACcrearCabecera(IMAGEN *c);
- int MACescribirLinea(char *p,FILE *f);
- void MACescribirImagen(IMAGEN *c,FILE *f);
-
-
- /*---- CODIFICACION DE LAS FUNCIONES OFRECIDAS -------------------------------*/
-
-
- /*---- FUNCION: extern IMAGEN *MACcargar(char *nombre,IMAGEN *c) ---------------------
-
- Descripción:
-
- Esta función carga en memoria un fichero de tipo MAC.
-
- Parámetros:
-
- char *nombre : nombre del fichero a cargar
- IMAGEN *c : puntero a estructura que alberga la imagen
-
- Retorno:
-
- - Puntero a la estructura de la imagen
- - NULL si hubo error
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern IMAGEN *MACcargar(char *nombre,IMAGEN *c)
- {
- /* puntero al fichero de entrada */
- FILE *f;
-
- /* abrir fichero */
- if((f=fopen(nombre,"rb")) != NULL)
- {
- /* leer cabecera MAC */
- if((c = MACleerCabecera(c,f,nombre))!=NULL)
- {
- /* cargar imagen MAC */
- if(MACleerImagen(c,f)!=72)
- {
- /* si no es MAC */
- c = MEMliberar(c);
- ERRORponer(ERRlectura);
- }
- }
- }
- else
- {
- ERRORponer(ERRapertura);
- return(NULL);
- }
- /* cerrar fichero y devolver cabecera */
- fclose(f);
- return(c);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------------*/
-
-
- /*---- FUNCION: extern int MACsalvar(char *fichero,IMAGEN *c) ---------------------
-
- Descripción:
-
- Esta función salva en disco una imagen con formato MAC.
-
- Parámetros:
-
- char *nombre : nombre del fichero a cargar
- IMAGEN *c : puntero a estructura que alberga la imagen
-
- Retorno:
-
- - 0 si hay error
- - 1 en caso contrario
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int MACsalvar(char *fichero,IMAGEN *c)
- {
- /* puntero al fichero de salida */
- FILE *f;
-
- /* si no es monocromo, no se puede salvar como MAC */
- if(c->modo != VIDEOmono)
- {
- ERRORponer(ERRformato);
- return(0);
- }
- /* abrir el fichero */
- if((f = fopen(fichero, "wb")) == NULL)
- {
- ERRORponer(ERRapertura);
- return(0);
- }
-
- /* crear la cabecera MAC */
- MACcrearCabecera(c);
-
- /* escribir la cabecera MAC */
- if(fwrite((char *)&cabecera,1,sizeof(CABmac),f) != sizeof(CABmac))
- {
- ERRORponer(ERRescritura);
- return(0);
- }
- /* escribir la imagen MAC */
- MACescribirImagen(c,f);
-
- fclose(f);
- return(1);
- }
-
- /*---- FIN FUNCION --------------------------------------------------------------*/
-
-
- /*---- CODIFICACION DE LAS FUNCIONES INTERNAS --------------------------------*/
-
-
- /*---- FUNCION: IMAGEN *MACleerCabecera(IMAGEN *c,FILE *f,char *nombre) -------------
-
- Descripción:
-
- Esta función reserva memoria para la imagen y lee la cabecera del fichero
- MAC.
-
- Parámetros:
-
- IMAGEN *c : puntero a estructura que alberga la imagen
- FILE *f : puntero al fichero
- char *nombre : nombre del fichero a cargar
-
- Retorno:
-
- - Puntero a la estructura de la imagen
- - NULL si hubo error
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- IMAGEN *MACleerCabecera(IMAGEN *c,FILE *f,char *nombre)
- {
- /* leer cabecera MAC */
- if(fread((char *)&cabecera,1,sizeof(CABmac),f)==sizeof(CABmac))
- {
- /* si es cabecera de 512 bytes... */
- if(memcmp(cabecera.tipo,"PNTG",4))
- /* ...retroceder 128 bytes */
- fseek(f,-(128),SEEK_CUR);
-
- /* reservar memoria para la cabecera de trabajo */
- if((c=MEMreservarCAB(c))==NULL)
- {
- ERRORponer(ERRnoMemoria);
- return(NULL);
- }
-
- /* cargar cabecera de trabajo */
- strcpy(c->nombre,nombre);
- c->ancho = 576;
- c->alto = 720;
- c->bytes = 72;
- c->formato = MACPAINT;
- c->modo = VIDEOmono;
- c->colores = 2;
- c->haypaleta = FALSO;
-
- /* reservar memoria para la imagen */
- if(!MEMreservar(c))
- /* si no hay memoria, liberar cabecera */
- {
- c = MEMliberar(c);
- ERRORponer(ERRnoMemoria);
- return(c);
- }
- }
- else
- {
- ERRORponer(ERRlectura);
- return(NULL);
- }
- return(c);
- }
-
- /*---- FIN FUNCION ----------------------------------------------------------------*/
-
-
- /*---- FUNCION: int MACleerImagen(IMAGEN *c,FILE *f) -----------------------------
-
- Descripción:
-
- Esta función carga en memoria una imagen de tipo MAC.
-
- Parámetros:
-
- IMAGEN *c : puntero a estructura que alberga la imagen
- FILE *f: puntero al fichero
-
- Retorno:
-
- - 72 si se ha leido correctamente
- - cualquier otro número si hubo error
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- int MACleerImagen(IMAGEN *c,FILE *f)
- {
- /* contador de lineas */
- int i;
- /* bytes por linea */
- int n;
- /* buffer */
- char p[256];
-
- /* hasta las 720 lineas... */
- for(i=0;i<720;++i)
- {
- /* leer linea */
- if((n=MACleerLinea(p,f))!= 72)
- {
- /* si no tiene 72 bytes */
- break;
- }
- /* llevar linea a memoria */
- MEMescribir(p,i,c);
- }
- return(n);
- }
-
- /*---- FIN FUNCION -------------------------------------------------------------*/
-
-
- /*---- FUNCION: int MACleerLinea(char *p,FILE *f) -----------------------------
-
- Descripción:
-
- Esta función lee una línea de un fichero de tipo MAC.
-
- Parámetros:
-
- char *p : puntero a buffer dode se almacena la línea
- FILE *f: puntero al fichero
-
- Retorno:
-
- - 72 si se ha leido correctamente
- - 0 si hubo error
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- int MACleerLinea(char *p,FILE *f)
- {
- /* caracter leido */
- int c;
- /* contador de repeticion */
- int i;
- /* contador de bytes por linea */
- int n=0;
-
- do
- {
- /* lee caracter del fichero */
- c=fgetc(f) & 0xff;
-
- /* si el bit 7 es 1... */
- if(c & 0x80)
- {
- /* calcular complemento a 2 y usarlo como contador */
- i = ((~c) & 0xff)+2;
- /* leer siguiente byte */
- c =fgetc(f);
- /* cargarlo 'i' veces */
- while(i--)
- p[n++] = ~c;
- }
- else
- /* si el bit 7 es 0... */
- {
- /* tomar contador */
- i =(c & 0xff)+1;
- /* leer 'i' bytes */
- while(i--)
- p[n++] = 0xff & ~(fgetc(f));
- }
- }
- /* ...hasta 72 bytes maximo */
- while(n < 72);
-
- /* si hay fin de fichero imprevisto */
- if(c == EOF)
- n=0;
- return(n);
- }
-
- /*---- FIN FUNCION ----------------------------------------------------------*/
-
-
- /*---- FUNCION: int MACcrearCabecera(IMAGEN *c) -----------------------------------
-
- Descripción:
-
- Esta función crea una cabecera de tipo MAC.
-
- Parámetros:
-
- IMAGEN *c : puntero a estructura que alberga la imagen
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void MACcrearCabecera(IMAGEN *c)
- {
- /* rellena los datos de la cabecera */
- cabecera.byte_cero=0;
- cabecera.longitud=strlen(c->nombre);
- strcpy(cabecera.nombre,c->nombre);
- strcpy(cabecera.tipo,"PNTG");
- strcpy(cabecera.creador,"MPNT");
- memchr(cabecera.relleno1,' ',10);
- cabecera.tam_datos = 0;
- cabecera.tam_codigo = 0;
- cabecera.creacion = 0;
- cabecera.modificacion = 0;
- memchr(cabecera.relleno2,' ',33);
- memchr(cabecera.patrones,' ',304);
- memchr(cabecera.relleno3,' ',204);
- }
-
- /*-- FIN FUNCION ----------------------------------------------------------------*/
-
-
- /*---- FUNCION: void MACescribirImagen(IMAGEN *c,FILE *f) -----------------------------
-
- Descripción:
-
- Esta función graba la imagen en un fichero de tipo MAC.
-
- Parámetros:
-
- IMAGEN *c : puntero a estructura que alberga la imagen
- FILE *f: puntero al fichero
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void MACescribirImagen(IMAGEN *c,FILE *f)
- {
- /* contador de lineas */
- int i;
- /* bytes por linea */
- int bytes;
- /* buffers temporales para la linea */
- char p[1024];
- char q[72];
-
- /* obtener el numero de bytes */
- bytes = (c->bytes > 72) ? 72 : c->bytes;
-
- /* salvar imagen */
- for(i = 0; i < c->alto;++i)
- {
- MEMleer(p,i,c);
- memset(q,0,72);
- memcpy(q,p,bytes);
- MACescribirLinea(p,f);
- }
- for(;i<720;++i)
- {
- memset(p,0,72);
- MACescribirLinea(p,f);
- }
- }
-
- /*-- FIN FUNCION ----------------------------------------------------------------*/
-
-
- /*---- FUNCION: void MACescribirLinea(char *p,FILE *f) -------------------------
-
- Descripción:
-
- Esta función comprime una línea en formato MAC y la graba en un fichero.
-
- Parámetros:
-
- char *p : puntero a buffer que alberga la línea
- FILE *f : puntero al fichero
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
-
- int MACescribirLinea(char *p,FILE *f)
- {
- /* buffer temporal */
- char b[72];
- int bdex=0,
- i=0,
- j=0,
- t=0;
-
- do
- {
- i=0;
- while((p[t+i]==p[t+i+1]) && ((t+i) < 71))
- ++i;
- /* si se repiten los datos... */
- if(i>0)
- {
- /* paquete de bytes distintos */
- if(bdex)
- {
- fputc(((bdex-1) & 0x7F),f);
- j+=1;
- fwrite(b,1,bdex,f);
- j+=bdex;
- bdex=0;
- }
- /* paquete de bytes iguales */
- fputc((~i+1),f);
- fputc(~p[t+i],f);
- j+=2;
- t+=(i+1);
- }
- else
- b[bdex++]=~p[t++];
- }while(t<72);
-
- /* si quedan bytes pendientes... */
- if(bdex)
- {
- fputc(((bdex-1) & 0x7F),f);
- j+=1;
- fwrite(b,1,bdex,f);
- j+=bdex;
- bdex=0;
- }
- return(j);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-